import Vue from 'vue'
import axios from 'axios'
import store from '@/store'
import { VueAxios } from './axios'
import { Modal, notification } from 'ant-design-vue'
import { ACCESS_TOKEN } from "@/store/mutation-types"

/**
 * 【指定 axios的 baseURL】
 * 如果手工指定 baseURL: '/f'
 * 则映射后端域名，通过 vue.config.js
 * @type {*|string}
 */
let apiBaseUrl = window._CONFIG['domianURL'] || "/f";
console.log("apiBaseUrl= ", apiBaseUrl)

// 创建 axios 实例
const service = axios.create({
    //baseURL: '/f',
    baseURL: apiBaseUrl, // api base_url
    timeout: 16000 // 请求超时时间
})
const err = (error) => {
    if (error.response) {
        let that = this;
        let data = error.response.data
        const token = Vue.ls.get(ACCESS_TOKEN)
        switch (error.response.status) {
            case 403:
                notification.error({ message: '系统提示', description: '拒绝访问', duration: 4 })
                break
            case 500:
                if (error.response.message == "Token标识已失效" && window.document.location.pathname.indexOf("/user/login") == -1) {
                    store.dispatch('Logout').then(() => {
                        Vue.ls.remove(ACCESS_TOKEN)
                        try {
                            let path = window.document.location.pathname
                            console.log("location pathname -> " + path)
                            if (path != "/" && path.indexOf('/user/login') == -1) {
                                window.location.reload()
                            }
                        } catch (e) {
                            window.location.reload()
                        }
                    })
                }else if (error.response.message == "Token失效，请重新登录!" && window.document.location.pathname.indexOf("/user/login") == -1) {
                    // update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式，不直接跳转----
                    Modal.error({
                        title: '登录已过期',
                        content: '很抱歉，登录已过期，请重新登录',
                        okText: '重新登录',
                        mask: false,
                        onOk: () => {
                            store.dispatch('Logout').then(() => {
                                Vue.ls.remove(ACCESS_TOKEN)
                                try {
                                    let path = window.document.location.pathname
                                    console.log("location pathname -> " + path)
                                    if (path != "/" && path.indexOf('/user/login') == -1) {
                                        window.location.reload()
                                    }
                                } catch (e) {
                                    window.location.reload()
                                }
                            })
                        }
                    })
                    // update-end- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式，不直接跳转----
                }
                break
            case 404:
                notification.error({ message: '系统提示', description: '很抱歉，资源未找到!', duration: 4 })
                break
            case 504:
                notification.error({ message: '系统提示', description: '网络超时' })
                break
            case 401:
                notification.error({ message: '系统提示', description: '未授权，请重新登录', duration: 4 })
                if (token) {
                    store.dispatch('Logout').then(() => {
                        setTimeout(() => {
                            window.location.reload()
                        }, 1500)
                    })
                }
                break
            default:
               
                notification.error({
                    message: '系统提示',
                    description: data.message,
                    duration: 4
                })
                break
        }
    }
    return Promise.reject(error)
};

// request interceptor
service.interceptors.request.use(config => {
    const token = Vue.ls.get(ACCESS_TOKEN)
    if (token) {
        config.headers['X-Access-Token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
    }
    if (config.method == 'get') {
        if (config.url.indexOf("sys/dict/getDictItems") < 0) {
            config.params = {
                _t: Date.parse(new Date()) / 1000,
                ...config.params
            }
        }
    }
    return config
}, (error) => {
    return Promise.reject(error)
})

// response interceptor
service.interceptors.response.use((response) => {
    if (response.data.message == "Token标识已失效") {
        store.dispatch('Logout').then(() => {
            Vue.ls.remove(ACCESS_TOKEN)
            try {
                let path = window.document.location.pathname
                console.log("location pathname -> " + path)
                if (path != "/" && path.indexOf('/user/login') == -1) {
                    window.location.reload()
                }
            } catch (e) {
                window.location.reload()
            }
        })
    }else if (response.data.message == "Token失效，请重新登录!") {
        // update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式，不直接跳转----
        Modal.error({
            title: '登录已过期',
            content: '很抱歉，登录已过期，请重新登录',
            okText: '重新登录',
            mask: false,
            onOk: () => {
                store.dispatch('Logout').then(() => {
                    Vue.ls.remove(ACCESS_TOKEN)
                    try {
                        let path = window.document.location.pathname
                        console.log("location pathname -> " + path)
                        if (path != "/" && path.indexOf('/user/login') == -1) {
                            window.location.reload()
                        }
                    } catch (e) {
                        window.location.reload()
                    }
                })
            }
        })
        // update-end- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式，不直接跳转----
    }
    return response.data
}, err)

const installer = {
    vm: {},
    install(Vue, router = {}) {
        Vue.use(VueAxios, router, service)
    }
}

export {
    installer as VueAxios,
    service as axios
}